/**
 * @file query_result.h
 * @brief 查询结果类 - 查询结果处理
 */

#ifndef KWDB_QUERY_RESULT_H
#define KWDB_QUERY_RESULT_H

#include <string>
#include <vector>
#include <map>
#include <memory>
#include <stdexcept>

namespace kwdb {

/**
 * @brief 查询结果行
 */
class QueryRow {
public:
    /**
     * @brief 构造函数
     * @param values 行值列表
     * @param columns 列名列表
     */
    QueryRow(const std::vector<std::string>& values, const std::vector<std::string>& columns);
    
    /**
     * @brief 获取指定列的值
     * @param columnName 列名
     * @return 列值
     * @throws std::out_of_range 列不存在
     */
    const std::string& getValue(const std::string& columnName) const;
    
    /**
     * @brief 获取指定索引的值
     * @param index 索引
     * @return 列值
     * @throws std::out_of_range 索引越界
     */
    const std::string& getValue(size_t index) const;
    
    /**
     * @brief 获取所有值
     * @return 值列表
     */
    const std::vector<std::string>& getValues() const;
    
    /**
     * @brief 获取所有命名值
     * @return 命名值映射
     */
    const std::map<std::string, std::string>& getNamedValues() const;
    
    /**
     * @brief 检查列是否存在
     * @param columnName 列名
     * @return 是否存在
     */
    bool hasColumn(const std::string& columnName) const;
    
    /**
     * @brief 获取列数
     * @return 列数
     */
    size_t getColumnCount() const;
    
    /**
     * @brief 转换为字符串
     * @return 字符串表示
     */
    std::string toString() const;

private:
    std::vector<std::string> values_;
    std::map<std::string, std::string> namedValues_;
    std::vector<std::string> columns_;
};

/**
 * @brief 查询结果类
 * 
 * 提供查询结果的处理功能：
 * - 结果行访问
 * - 列信息获取
 * - 统计信息
 * - 迭代器支持
 */
class QueryResult {
public:
    /**
     * @brief 构造函数
     * @param success 是否成功
     * @param message 消息
     * @param columns 列名列表
     * @param rows 结果行列表
     * @param totalCount 总行数
     * @param executionTime 执行时间（毫秒）
     * @param errorCode 错误代码
     * @param hasMore 是否还有更多数据
     */
    QueryResult(bool success,
                const std::string& message,
                const std::vector<std::string>& columns,
                const std::vector<std::shared_ptr<QueryRow>>& rows,
                int totalCount = 0,
                int64_t executionTime = 0,
                const std::string& errorCode = "",
                bool hasMore = false);
    
    /**
     * @brief 检查是否成功
     * @return 是否成功
     */
    bool isSuccess() const;
    
    /**
     * @brief 获取消息
     * @return 消息
     */
    const std::string& getMessage() const;
    
    /**
     * @brief 获取列名列表
     * @return 列名列表
     */
    const std::vector<std::string>& getColumns() const;
    
    /**
     * @brief 获取结果行列表
     * @return 结果行列表
     */
    const std::vector<std::shared_ptr<QueryRow>>& getRows() const;
    
    /**
     * @brief 获取总行数
     * @return 总行数
     */
    int getTotalCount() const;
    
    /**
     * @brief 获取执行时间
     * @return 执行时间（毫秒）
     */
    int64_t getExecutionTime() const;
    
    /**
     * @brief 获取错误代码
     * @return 错误代码
     */
    const std::string& getErrorCode() const;
    
    /**
     * @brief 是否还有更多数据
     * @return 是否还有更多数据
     */
    bool hasMore() const;
    
    /**
     * @brief 获取行数
     * @return 行数
     */
    size_t size() const;
    
    /**
     * @brief 检查是否为空
     * @return 是否为空
     */
    bool empty() const;
    
    /**
     * @brief 获取指定索引的行
     * @param index 索引
     * @return 结果行
     * @throws std::out_of_range 索引越界
     */
    const QueryRow& operator[](size_t index) const;
    
    /**
     * @brief 获取指定索引的行
     * @param index 索引
     * @return 结果行
     * @throws std::out_of_range 索引越界
     */
    const QueryRow& at(size_t index) const;
    
    /**
     * @brief 转换为JSON字符串
     * @return JSON字符串
     */
    std::string toJson() const;
    
    /**
     * @brief 转换为CSV字符串
     * @return CSV字符串
     */
    std::string toCsv() const;
    
    /**
     * @brief 转换为字符串
     * @return 字符串表示
     */
    std::string toString() const;

private:
    bool success_;
    std::string message_;
    std::vector<std::string> columns_;
    std::vector<std::shared_ptr<QueryRow>> rows_;
    int totalCount_;
    int64_t executionTime_;
    std::string errorCode_;
    bool hasMore_;
    
    /**
     * @brief 构建命名值映射
     * @param values 值列表
     * @param columns 列名列表
     * @return 命名值映射
     */
    std::map<std::string, std::string> buildNamedValues(const std::vector<std::string>& values,
                                                       const std::vector<std::string>& columns) const;
};

} // namespace kwdb

#endif // KWDB_QUERY_RESULT_H
